package com.smz.service.impl;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.smz.dao.TLaserDAO;
import com.smz.dao.TPrinterDAO;
import com.smz.dao.TProductOrderDAO;
import com.smz.entity.TLaser;
import com.smz.entity.TPrinter;
import com.smz.entity.TProductOrder;
import com.smz.service.TLaserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

/**
 * @author Kan
 * @Time 2021-11-21-18:48
 */
@Service
public class TLaserServiceImpl extends ServiceImpl<TLaserDAO, TLaser> implements TLaserService {
    @Autowired
    TLaserDAO tLaserDAO;
    @Autowired
    TProductOrderDAO tProductOrderDAO;
    @Autowired
    TPrinterDAO tPrinterDAO;


    @Transactional
    @Override
    public List<TLaser> addToLaser(String[] orderIds) {
        UpdateWrapper<TProductOrder> tProductOrderWrapper = new UpdateWrapper<>();
        UpdateWrapper<TLaser> updateWrapper = new UpdateWrapper<>();
        for (String orderId : orderIds) {
            long time = new Date().getTime();
            tProductOrderWrapper.eq("order_id",orderId).set("product_status","3");
            //该产品信息
            TProductOrder tProductOrder = tProductOrderDAO.selectOne(tProductOrderWrapper);
            //更新，之前激光码作废
            updateWrapper.eq("l_no", orderId).set("l_code", time).set("l_printer", tProductOrder.getPrinter()).set("l_status", "2");
            //未生产则新增
            TLaser tLaser = new TLaser();
            tLaser.setLNo(orderId);
            tLaser.setLCode(String.valueOf(time));
            tLaser.setLStatus("2");
            tLaser.setLNo(String.valueOf(tProductOrder.getOrderId()));
            tLaser.setLPrinter(tProductOrder.getPrinter());
            this.saveOrUpdate(tLaser, updateWrapper);
            //更新产品状态
            tProductOrder.setLaserCode("1");
            tProductOrderDAO.update(tProductOrder, tProductOrderWrapper);

            updateWrapper.clear();
            tProductOrderWrapper.clear();
        }
        QueryWrapper<TLaser> wrapper = new QueryWrapper<>();
        wrapper.in("l_no",Arrays.asList(orderIds));
        return  tLaserDAO.selectList(wrapper);
    }

    @Transactional
    @Override
    public String removeLaser(Integer[] orderIds) {
        QueryWrapper<TProductOrder> orderWrapper = new QueryWrapper<>();
        UpdateWrapper<TLaser> laserWrapper = new UpdateWrapper<>();
        for (Integer orderId : orderIds) {
            orderWrapper.eq("order_id",orderId);
            laserWrapper.eq("l_no",orderId);
            TProductOrder order = tProductOrderDAO.selectOne(orderWrapper);
            order.setLaserCode("2");
            tProductOrderDAO.update(order,orderWrapper);
            tLaserDAO.delete(laserWrapper);
            orderWrapper.clear();
            laserWrapper.clear();
        }
        return "ok";
    }

    @Override
    public Page<TLaser> findLaserOrders(Integer current, Long pageSize, Long orderId, Long orderStatus) {
        Page<TLaser> laserPage = new Page<>(current, pageSize);
        //没有指定订单号或者激光码
        if(orderId == null){
            //默认加载查询该类型全部
            return laserPage.setRecords(tLaserDAO.selectLaserByPage(laserPage, orderStatus));
        }
        //查询指定订单号
        else if(orderId != null){
            List<TLaser> tLasersByOrder = tLaserDAO.selectLaserDesignOrderId(laserPage, orderStatus, orderId);
            if (tLasersByOrder.isEmpty()) {
                return laserPage.setRecords(tLaserDAO.selectLaserDesignCode(laserPage,orderStatus,orderId));
            }else {
                return laserPage.setRecords(tLasersByOrder);
            }
        }
        return null;
    }

    @Transactional
    @Override
    public String toPrint(String printer, Integer[] laserIdArr, Integer[] orderIdArr) {
        TLaser tLaser = new TLaser();
        tLaser.setLPrinter(printer);
        for (Integer laserId : laserIdArr) {
            tLaser.setId(laserId);
            tLaserDAO.updateById(tLaser);
        }
        UpdateWrapper<TProductOrder> updateWrapper = new UpdateWrapper<>();

        //插入日期
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String d = sdf.format(date.getTime());

        for (Integer orderId : orderIdArr) {
            updateWrapper.eq("order_id",orderId).set("printer",printer)
                    .set("product_status","5").set("product_time",d);
            tProductOrderDAO.update(null, updateWrapper);
        }
        return "ok";
    }

    @Transactional
    @Override
    public String autoToPrint(Integer[] orderIdArr) {
//        查询所有打印机
        List<TPrinter> tPrinters = tPrinterDAO.selectList(null);
        UpdateWrapper<TProductOrder> updateWrapper = new UpdateWrapper<>();
        UpdateWrapper<TLaser> laserWrapper = new UpdateWrapper<>();
        for (Integer orderId : orderIdArr) {
            //随机选取一台打印机
            int i = (int)(Math.random() * tPrinters.size());
            laserWrapper.eq("l_no",orderId).set("l_printer",tPrinters.get(i).getPNum());

            //插入日期
            Date date = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String d = sdf.format(date.getTime());

            updateWrapper.eq("order_id",orderId).set("printer",tPrinters.get(i).getPNum())
                    .set("product_status","5").set("product_time",d);
            tLaserDAO.update(null,laserWrapper);
            tProductOrderDAO.update(null,updateWrapper);
            laserWrapper.clear();
            updateWrapper.clear();
        }

        return "ok";
    }

    @Transactional
    @Override
    public String removeToPrint(Integer[] orderIdArr) {
        UpdateWrapper<TLaser> tLaserWrapper = new UpdateWrapper<>();
        UpdateWrapper<TProductOrder> tProductOrderWrapper = new UpdateWrapper<>();
        for (Integer orderId : orderIdArr) {
            tLaserWrapper.eq("l_no",orderId).set("l_printer",null);
            tProductOrderWrapper.eq("order_id",orderId)
                    .set("printer",null).set("product_status","3").set("product_time",null);
            tLaserDAO.update(null,tLaserWrapper);
            tProductOrderDAO.update(null,tProductOrderWrapper);
            tLaserWrapper.clear();
            tProductOrderWrapper.clear();
        }
        return "ok";
    }


}
